package xhe.entities;

import java.util.HashMap;
import java.util.Map;

import org.springframework.util.StringUtils;

import xhe.enums.ExecuteEnum;
import xhe.lib.base.YmlUtils;
import xhe.lib.date.DateTime;
import xhe.lib.date.TimeStamp;

/**
 * <b> 实体类: </b> 接口实体对象
 * 
 * @author xhe
 * @version V1.0.0.0
 * @version --2020年1月23日
 */
public class ApiEntity {
	private String loginName;
	private String userName;
	private String authCode;
	private String bareausCode;
	private String bussinessCode;
	private String serviceCode;
	private String request = "";
	private String methodName = "";
	private String params = "";
	private String result = "";
	private ExecuteEnum code = ExecuteEnum.Success;
	private String message = "";
	private String token = "";
	private String response = "";
	private Boolean returnType = true;
	private String dbType = "";
	private String connection = "";
	private Map<String, String> dbConnection = new HashMap<String, String>();
	private Map<String, Map<String, String>> dbConnectionList = new HashMap<String, Map<String, String>>();
	private String requestTime;
	private String responseTime;
	private int executeTime;
	private String tableName;
	private String primaryKey;
	private String primaryValue;
	private String content;
	private int operateType;
	private String dataCode;
	private String dataType;
	private String dataTotal;
	private String remarks;
	private String clientIP;
	private Boolean writeLog;

	public ApiEntity() {
		try {
			this.setRequestTime(DateTime.toString(DateTime.now(), "yyyy-MM-dd HH:mm:ss"));
			// this.setClientIP(Inet4Address.getLocalHost().getHostAddress());
			this.setClientIP("127.0.0.1");
//			Map<String, String> oDataSourceMap = YmlUtils.getYmlMapsByFileName("application.yml", "spring",
//					"datasource", this.getDBType().toLowerCase());

			Map<String, Map<String, String>> oDataSourceMap = YmlUtils.getConnectionByYml();

			// System.out.println("ClientIP:" +
			// Inet4Address.getLocalHost().getHostAddress());

			this.setDBConnectionList(oDataSourceMap);

			if (oDataSourceMap.containsKey("default")) {
				this.setDBConnection(oDataSourceMap.get("default"));
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public ApiEntity(String dbKey) {
		try {
			this.setRequestTime(DateTime.toString(DateTime.now(), "yyyy-MM-dd HH:mm:ss"));
			this.setClientIP("127.0.0.1");
			Map<String, Map<String, String>> oDataSourceMap = YmlUtils.getConnectionByYml();

			this.setDBConnectionList(oDataSourceMap);

			if (oDataSourceMap.containsKey(dbKey)) {
				this.setDBConnection(oDataSourceMap.get(dbKey));
			} else if (oDataSourceMap.containsKey("default")) {
				this.setDBConnection(oDataSourceMap.get("default"));
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * <b> 属性: </b> 获取登录名
	 * 
	 * @return String 登录名
	 */
	public String getLoginName() {
		return loginName;
	}

	/**
	 * <b> 属性: </b> 设置登录名
	 * 
	 * @param loginName 登录名
	 */
	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	/**
	 * <b> 属性: </b> 获取用户名
	 * 
	 * @return String 用户名
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * <b> 属性: </b> 设置用户名
	 * 
	 * @param userName 用户名
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}

	/**
	 * <b> 属性: </b> 获取请求串
	 * 
	 * @return String 请求串
	 */
	public String getRequest() {
		return this.request;
	}

	/**
	 * <b> 属性: </b> 设置请求串
	 * 
	 * @param request 请求串
	 */
	public void setRequest(String request) {
		this.request = request;
	}

	/**
	 * <b> 属性: </b> 获取方法名称
	 * 
	 * @return String 方法名称
	 */
	public String getMethodName() {
		return this.methodName;
	}

	/**
	 * <b> 属性: </b> 设置方法名称
	 * 
	 * @param method 方法名称
	 */
	public void setMethodName(String method) {
		this.methodName = method;
	}

	/**
	 * <b> 属性: </b> 获取接口参数
	 * 
	 * @return String 参数
	 */
	public String getParams() {
		return this.params;
	}

	/**
	 * <b> 属性: </b> 设置方法参数
	 * 
	 * @param params 参数
	 */
	public void setParams(String params) {
		this.params = params;
	}

	/**
	 * <b> 属性: </b> 获取返回结果
	 * 
	 * @return String 返回结果
	 */
	public String getResult() {
		return this.result;
	}

	/**
	 * <b> 属性: </b> 设置返回结果
	 * 
	 * @param result 返回结果
	 */
	public void setResult(String result) {
		this.result = result;
	}

	/**
	 * <b> 属性: </b> 获取执行代码
	 * 
	 * @return ExecuteEnum 执行代码
	 */
	public ExecuteEnum getCode() {
		return this.code;
	}

	/**
	 * <b> 属性: </b> 设置执行代码
	 * 
	 * @param code 执行代码
	 */
	public void setCode(ExecuteEnum code) {
		this.code = code;
	}

	/**
	 * <b> 属性: </b> 获取执行信息
	 * 
	 * @return String 执行信息
	 */
	public String getMessage() {
		return this.message;
	}

	/**
	 * <b> 属性: </b> 设置执行信息
	 * 
	 * @param message 执行信息
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * <b> 属性: </b> 获取Token
	 * 
	 * @return String Token
	 */
	public String getToken() {
		return this.token;
	}

	/**
	 * <b> 属性: </b> 设置Token
	 * 
	 * @param token Token
	 */
	public void setToken(String token) {
		this.token = token;
	}

	/**
	 * <b> 属性: </b> 获取响应结果
	 * 
	 * @return String 响应结果
	 */
	public String getResponse() {
		this.setResponse();
		// return this.Response;
		return this.response.replace("\\", "\\\\");
	}

	/**
	 * <b> 属性: </b> 设置响应结果
	 */
	public void setResponse() {
		if (StringUtils.isEmpty(this.result)) {
			this.result = "[]";
		}

		if (this.getReturnType()) {
			this.response = "{\"Methed\":\"" + this.methodName + "\",\"Code\":" + this.code.getCode()
					+ ",\"Message\":\"" + this.message + "\",\"Result\":" + this.result + "}";
		} else {
			this.response = this.result;
		}
	}

	/**
	 * <b> 属性: </b> 获取返回类型
	 * 
	 * @return Boolean 返回类型
	 */
	public Boolean getReturnType() {
		return returnType;
	}

	/**
	 * <b> 属性: </b> 设置返回类型
	 * 
	 * @param returnType 返回类型
	 */
	public void setReturnType(Boolean returnType) {
		this.returnType = returnType;
	}

	/**
	 * <b> 属性: </b> 获取TokenKey
	 * 
	 * @return String Key
	 */
	public String getTokenKey() {
		return this.getToken().substring(0, this.getToken().indexOf("|"));
	}

	/**
	 * <b> 属性: </b> 设置TokenValue
	 * 
	 * @return String Value
	 */
	public String getTokenValue() {
		return this.getToken().substring(this.getToken().indexOf("|") + 1);
	}

	/**
	 * <b> 属性: </b> 获取数据链接类型
	 * 
	 * @return String 类型
	 */
	public String getDBType() {
		return dbType;
	}

	/**
	 * <b> 属性: </b> 设置数据链接类型
	 * 
	 * @param dBType 类型
	 */
	public void setDBType(String dBType) {
		dbType = dBType;

		try {
			if (this.getDBConnectionList().containsKey(dBType)) {

				this.setDBConnection(this.getDBConnectionList().get(dBType));
			} else if (dBType == null || dBType == "") {

				this.setDBConnection(this.getDBConnectionList().get("default"));
			} else {

				this.setDBConnection(new HashMap<String, String>());
			}
		} catch (Exception ex) {
		}
	}

	/**
	 * <b> 属性: </b> 获取数据链接
	 * 
	 * @return String 类型
	 */
	public String getConnection() {
		return connection;
	}

	/**
	 * <b> 属性: </b> 设置数据链接
	 * 
	 * @param connection 链接字符串
	 */
	public void setConnection(String connection) {
		this.connection = connection;
	}

	/**
	 * <b> 属性: </b> 获取数据库连接属性
	 * 
	 * @return Map 属性集合
	 */
	public Map<String, String> getDBConnection() {
		return dbConnection;
	}

	/**
	 * <b> 属性: </b> 设置数据库连接属性
	 * 
	 * @param dbConnection 属性集合
	 */
	public void setDBConnection(Map<String, String> dbConnection) {
		this.dbConnection = dbConnection;
	}

	/**
	 * <b> 属性: </b> 设置数据库连接属性
	 * 
	 * @param dbConnection 数据连接字符串
	 */
	public void setDBConnection(String dbConnection, String userName, String passWord) {

		Map<String, String> oConnection = new HashMap<String, String>();

		oConnection.put("jdbc-url", dbConnection);
		oConnection.put("username", userName);
		oConnection.put("password", passWord);

		if (dbConnection.toLowerCase().contains("gauss")) {
			// Gauss数据库
			this.setDBType("gaussdb");
			oConnection.put("driver-class-name", "com.huawei.gauss200.jdbc.Driver");

		} else if (dbConnection.toLowerCase().contains("sqlserver")) {
			// SQLServer数据库
			this.setDBType("sqlserver");
			oConnection.put("driver-class-name", "com.microsoft.sqlserver.jdbc.SQLServerDriver");

		} else {
			// MySQL数据库
			this.setDBType("mysql");
			oConnection.put("driver-class-name", "org.gjt.mm.mysql.Driver");
		}

		this.dbConnection = oConnection;
	}

	/**
	 * <b> 属性: </b> 设置数据库连接属性
	 * 
	 * @param dbConnection 数据连接字符串
	 */
	public void setDBConnection(String Connection) {

		Map<String, String> oConnection = new HashMap<String, String>();

		String[] aryConnection = Connection.split("##");

		String dbConnection = aryConnection[0];
		String userName = aryConnection[1];
		String passWord = aryConnection[2];

		oConnection.put("jdbc-url", dbConnection);
		oConnection.put("username", userName);
		oConnection.put("password", passWord);

		if (dbConnection.toLowerCase().contains("gauss")) {
			// Gauss数据库
			this.setDBType("gaussdb");
			oConnection.put("driver-class-name", "com.huawei.gauss200.jdbc.Driver");

		} else if (dbConnection.toLowerCase().contains("sqlserver")) {
			// SQLServer数据库
			this.setDBType("sqlserver");
			oConnection.put("driver-class-name", "com.microsoft.sqlserver.jdbc.SQLServerDriver");

		} else {
			// MySQL数据库
			this.setDBType("mysql");
			oConnection.put("driver-class-name", "org.gjt.mm.mysql.Driver");
		}

		this.dbConnection = oConnection;
	}

	/**
	 * <b> 属性: </b> 获取数据库连接属性
	 * 
	 * @return Map 属性集合
	 */
	public Map<String, Map<String, String>> getDBConnectionList() {
		return dbConnectionList;
	}

	/**
	 * <b> 属性: </b> 设置数据库连接属性
	 * 
	 * @param dbConnection 属性集合
	 */
	public void setDBConnectionList(Map<String, Map<String, String>> dbConnectionList) {
		this.dbConnectionList = dbConnectionList;
	}

	/**
	 * <b> 属性: </b> 获取请求时间
	 * 
	 * @return String 请求时间
	 */
	public String getRequestTime() {
		return requestTime;
	}

	/**
	 * <b> 属性: </b> 设置请求时间
	 * 
	 * @param dateTime 请求时间
	 */
	public void setRequestTime(String requestTime) {
		this.requestTime = requestTime;
	}

	/**
	 * <b> 属性: </b> 获取响应时间
	 * 
	 * @return String 响应时间
	 */
	public String getResponseTime() {
		return responseTime;
	}

	/**
	 * <b> 属性: </b> 设置响应时间
	 * 
	 * @param responseTime 响应时间
	 */
	public void setResponseTime(String responseTime) {
		this.responseTime = responseTime;
	}

	/**
	 * <b> 属性: </b> 获取执行时间(毫秒)
	 * 
	 * @return String 执行时间(毫秒)
	 */
	public int getExecuteTime() {

		try {
			long lExecuteTime = TimeStamp.compareMillsSecondes(this.getRequestTime(), this.getResponseTime());

			executeTime = Math.round(lExecuteTime);
		} catch (Exception ex) {
		}
		return executeTime;
	}

	/**
	 * <b> 属性: </b> 设置执行时间(毫秒)
	 * 
	 * @param executeTime 执行时间(毫秒)
	 */
	public void setExecuteTime(int executeTime) {
		this.executeTime = executeTime;
	}

	/**
	 * <b> 属性: </b> 获取执行的表名
	 * 
	 * @return String 执行的表名
	 */
	public String getTableName() {
		return tableName;
	}

	/**
	 * <b> 属性: </b> 设置执行的表名
	 * 
	 * @param tableName 执行的表名
	 */
	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	/**
	 * <b> 属性: </b> 获取主键名称
	 * 
	 * @return String 主键名称
	 */
	public String getPrimaryKey() {
		return primaryKey;
	}

	/**
	 * <b> 属性: </b> 设置主键名称
	 * 
	 * @param primarykey 主键名称
	 */
	public void setPrimaryKey(String primarykey) {
		this.primaryKey = primarykey;
	}

	/**
	 * <b> 属性: </b> 获取主键的值
	 * 
	 * @return String 主键的值
	 */
	public String getPrimaryValue() {
		return primaryValue;
	}

	/**
	 * <b> 属性: </b> 设置主键的值
	 * 
	 * @param primaryValue 主键的值
	 */
	public void setPrimaryValue(String primaryValue) {
		this.primaryValue = primaryValue;
	}

	/**
	 * <b> 属性: </b> 获取添加/编辑的内容
	 * 
	 * @return String 添加/编辑的内容
	 */
	public String getContent() {
		return content;
	}

	/**
	 * <b> 属性: </b> 设置添加/编辑的内容
	 * 
	 * @param content 添加/编辑的内容
	 */
	public void setContent(String content) {
		this.content = content;
	}

	/**
	 * <b> 属性: </b> 获取数据操作类型
	 * 
	 * @return int 数据操作类型
	 */
	public int getOperateType() {
		return operateType;
	}

	/**
	 * <b> 属性: </b> 设置数据操作类型
	 * 
	 * @param operateType 数据操作类型
	 */
	public void setOperateType(int operateType) {
		this.operateType = operateType;
	}

	/**
	 * <b> 属性: </b> 获取服务授权码
	 * 
	 * @return String 服务授权码
	 */
	public String getAuthCode() {
		return authCode;
	}

	/**
	 * <b> 属性: </b> 设置服务授权码
	 * 
	 * @param authCode 服务授权码
	 */
	public void setAuthCode(String authCode) {
		this.authCode = authCode;
	}

	/**
	 * <b> 属性: </b> 获取委办局/机构编码
	 * 
	 * @return String 委办局/机构编码
	 */
	public String getBareausCode() {
		return bareausCode;
	}

	/**
	 * <b> 属性: </b> 设置委办局/机构编码
	 * 
	 * @param bareausCode 委办局/机构编码
	 */
	public void setBareausCode(String bareausCode) {
		this.bareausCode = bareausCode;
	}

	/**
	 * <b> 属性: </b> 获取系统编码
	 * 
	 * @return String 系统编码
	 */
	public String getBussinessCode() {
		return bussinessCode;
	}

	/**
	 * <b> 属性: </b> 设置系统编码
	 * 
	 * @param bussinessCode 系统编码
	 */
	public void setBussinessCode(String bussinessCode) {
		this.bussinessCode = bussinessCode;
	}

	/**
	 * <b> 属性: </b> 获取服务编码
	 * 
	 * @return String 服务编码
	 */
	public String getServiceCode() {
		return serviceCode;
	}

	/**
	 * <b> 属性: </b> 设置服务编码
	 * 
	 * @param serviceCode 服务编码
	 */
	public void setServiceCode(String serviceCode) {
		this.serviceCode = serviceCode;
	}

	/**
	 * <b> 属性: </b> 获取数据名称
	 * 
	 * @return String 数据名称
	 */
	public String getDataCode() {
		return dataCode;
	}

	/**
	 * <b> 属性: </b> 设置数据名称
	 * 
	 * @param dataCode 数据名称
	 */
	public void setDataCode(String dataCode) {
		this.dataCode = dataCode;
	}

	/**
	 * <b> 属性: </b> 获取数据类型
	 * 
	 * @return String 数据类型
	 */
	public String getDataType() {
		return dataType;
	}

	/**
	 * <b> 属性: </b> 设置数据类型
	 * 
	 * @param dataType 数据类型
	 */
	public void setDataType(String dataType) {
		this.dataType = dataType;
	}

	/**
	 * <b> 属性: </b> 获取数据条数
	 * 
	 * @return String 数据条数
	 */
	public String getDataTotal() {
		return dataTotal;
	}

	/**
	 * <b> 属性: </b> 设置数据条数
	 * 
	 * @param dataTotal 数据条数
	 */
	public void setDataTotal(String dataTotal) {
		this.dataTotal = dataTotal;
	}

	/**
	 * <b> 属性: </b> 获取备注信息
	 * 
	 * @return String 备注信息
	 */
	public String getRemarks() {
		return remarks;
	}

	/**
	 * <b> 属性: </b> 设置备注信息
	 * 
	 * @param remarks 备注信息
	 */
	public void setRemarks(String remarks) {
		this.remarks = remarks;
	}

	/**
	 * <b> 属性: </b> 获取请求IP
	 * 
	 * @return String 请求IP
	 */
	public String getClientIP() {
		return clientIP;
	}

	/**
	 * <b> 属性: </b> 设置请求IP
	 * 
	 * @param clientIP 请求IP
	 */
	public void setClientIP(String clientIP) {
		this.clientIP = clientIP;
	}

	/**
	 * <b> 属性: </b> 是否记录操作日志
	 * 
	 * @return Boolean 是否记录操作日志
	 */
	public Boolean getWriteLog() {
		return writeLog;
	}

	/**
	 * <b> 属性: </b> 设置是否记录操作日志
	 * 
	 * @param writeLog 是否记录操作日志
	 */
	public void setWriteLog(Boolean writeLog) {
		this.writeLog = writeLog;
	}
}
